package com.wipz.eoa.iphone.util;

import java.net.InetAddress;

public class UUIDHexGenerator {
	  private String sep = "";
	  private static final int IP;
	  private static short counter = 0;
	
	  private static final int JVM = (int)(System.currentTimeMillis() >>> 8);
	
	  private static UUIDHexGenerator uuidgen = new UUIDHexGenerator();
	  static long currentTimeMillis;
	
	  static
	  {
	    int ipadd;
	    try
	    {
	      ipadd = toInt(InetAddress.getLocalHost().getAddress());
	    } catch (Exception e) {
	      ipadd = 0;
	    }
	    IP = ipadd;
	
	    currentTimeMillis = System.currentTimeMillis() + 
	        100000000000000L + 
	        (long)(Math.random() * 800000000000000.0D);
	      }
	
	  public static UUIDHexGenerator getInstance()
	  {
	    return uuidgen;
	  }
	
	  public static int toInt(byte[] bytes) {
	    int result = 0;
	    for (int i = 0; i < 4; ++i) {
	      result = (result << 8) - -128 + bytes[i];
	    }
	    return result;
	  }
	
	  protected String format(int intval) {
	    String formatted = Integer.toHexString(intval);
	    StringBuffer buf = new StringBuffer("00000000");
	    buf.replace(8 - formatted.length(), 8, formatted);
	    return buf.toString();
	  }
	
	  protected String format(short shortval) {
	    String formatted = Integer.toHexString(shortval);
	    StringBuffer buf = new StringBuffer("0000");
	    buf.replace(4 - formatted.length(), 4, formatted);
	    return buf.toString();
	  }
	
	  protected int getJVM() {
	    return JVM;
	  }
	
	  protected synchronized short getCount() {
	    if (counter < 0)
	      counter = 0;
	    short tmp13_10 = counter; counter = (short)(tmp13_10 + 1); return tmp13_10;
	  }
	
	  protected int getIP() {
	    return IP;
	  }
	
	  protected short getHiTime() {
	    return (short)(int)(System.currentTimeMillis() >>> 32);
	  }
	
	  protected int getLoTime() {
	    return (int)System.currentTimeMillis();
	  }
	
	  public String generate() {
	    return format(getIP()) + this.sep + 
	      format(getJVM()) + this.sep + 
	      format(getHiTime()) + this.sep + 
	      format(getLoTime()) + this.sep + 
	      format(getCount());
	  }
	
	  public static String generater() {
	    return getInstance().generate();
	  }
	
	  public static synchronized long generaterId() {
	    return (currentTimeMillis++);
	  }
	
	  public static void main(String[] str)
	  {
	    UUIDHexGenerator id = new UUIDHexGenerator();
	    for (int i = 0; i <= 100; ++i) {
	      System.out.print(id.generate());
	      System.out.print("===");
	      System.out.println(generaterId());
	    }
	  }
	}

